home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / boot / netBoot.new / dev / scsi.h < prev    next >
C/C++ Source or Header  |  1990-12-19  |  7KB  |  224 lines

  1.  
  2. /*    @(#)scsi.h 1.1 86/09/27 SMI    */
  3.  
  4. /*
  5.  * Copyright (c) 1986 by Sun Microsystems, Inc.
  6.  */
  7.  
  8. /*
  9.  * Messages that SCSI can send.
  10.  *
  11.  * For now, there is just one.
  12.  */
  13. #define    SC_COMMAND_COMPLETE    0x00
  14.  
  15. /*
  16.  * Standard SCSI control blocks.
  17.  * These go in or out over the SCSI bus.
  18.  */
  19. struct    scsi_cdb {        /* scsi command description block */
  20.     u_char    cmd;        /* command code */
  21.     u_char    lun      : 3;    /* logical unit number */
  22.     u_char    high_addr : 5;    /* high part of address */
  23.     u_char    mid_addr;    /* middle part of address */
  24.     u_char    low_addr;    /* low part of address */
  25.     u_char    count;        /* block count */
  26.     u_char    vu_57      : 1;    /* vendor unique (byte 5 bit 7) */
  27.     u_char    vu_56      : 1;    /* vendor unique (byte 5 bit 6) */
  28.     u_char          : 4;    /* reserved */
  29.     u_char    fr      : 1;    /* flag request (interrupt at completion) */
  30.     u_char    link      : 1;    /* link (another command follows) */
  31. };
  32.  
  33. /*
  34.  * defines for SCSI tape cdb.
  35.  */
  36. #define    t_code        high_addr
  37. #define    high_count    mid_addr
  38. #define    mid_count    low_addr
  39. #define low_count    count
  40.  
  41. struct    scsi_scb {        /* scsi status completion block */
  42.     /* byte 0 */
  43.     u_char    ext_st1    : 1;    /* extended status (next byte valid) */
  44.     u_char    vu_06    : 1;    /* vendor unique */
  45.     u_char    vu_05    : 1;    /* vendor unique */
  46.     u_char    is    : 1;    /* intermediate status sent */
  47.     u_char    busy    : 1;    /* device busy or reserved */
  48.     u_char    cm    : 1;    /* condition met */
  49.     u_char    chk    : 1;    /* check condition: sense data available */
  50.     u_char    vu_00    : 1;    /* vendor unique */
  51.     /* byte 1 */
  52.     u_char    ext_st2    : 1;    /* extended status (next byte valid) */
  53.     u_char    reserved: 6;    /* reserved */
  54.     u_char    ha_er    : 1;    /* host adapter detected error */
  55.     /* byte 2 */
  56.     u_char    byte2;        /* third byte */
  57. };
  58.  
  59. struct    scsi_sense {        /* scsi sense for error classes 0-6 */
  60.     u_char    adr_val    : 1;    /* sense data is valid */
  61.     u_char    class    : 3;    /* error class (0-6) */
  62.     u_char    code    : 4;    /* error code */
  63.     u_char    high_addr;    /* high byte of block addr */
  64.     u_char    mid_addr;    /* middle byte of block addr */
  65.     u_char    low_addr;    /* low byte of block addr */
  66.     u_char    extra[12];    /* pad this struct so it can hold max num */
  67.                 /* of sense bytes we may receive */
  68. };
  69.  
  70. struct    scsi_ext_sense {    /* scsi extended sense for error class 7 */
  71.     /* byte 0 */
  72.     u_char    adr_val    : 1;    /* sense data is valid */
  73.     u_char        : 7;    /* fixed at binary 1110000 */
  74.     u_char    seg_num;    /* segment number, applies to copy cmd only */
  75.     /* byte 2 */
  76.     u_char    fil_mk    : 1;    /* file mark on device */
  77.     u_char    eom    : 1;    /* end of media */
  78.     u_char    ili    : 1;    /* incorrect length indicator */
  79.     u_char        : 1;    /* reserved */
  80.     u_char    key    : 4;    /* sense key, see below */
  81.     u_char    info_1;        /* information byte 1 */
  82.     u_char    info_2;        /* information byte 2 */
  83.     u_char    info_3;        /* information byte 3 */
  84.     u_char    info_4;        /* information byte 4 */
  85.     u_char    add_len;    /* number of additional bytes */
  86.     /* additional bytes follow, if any */
  87. };
  88.     
  89. /* 
  90.  * Sense key values for extended sense.
  91.  */
  92. #define    SC_NO_SENSE        0x0
  93. #define    SC_RECOVERABLE_ERROR    0x1
  94. #define    SC_NOT_READY        0x2
  95. #define    SC_MEDIUM_ERROR        0x3
  96. #define    SC_HARDWARE_ERROR    0x4
  97. #define    SC_ILLEGAL_REQUEST    0x5
  98. #define    SC_UNIT_ATTENTION    0x6
  99. #define    SC_DATA_PROTECT        0x7
  100. #define    SC_BLANK_CHECK        0x8
  101. #define    SC_VENDOR_UNIQUE    0x9
  102. #define    SC_COPY_ABORTED        0xa
  103. #define    SC_ABORT_COMMAND    0xb
  104. #define    SC_EQUAL        0xc
  105. #define    SC_VOLUME_OVERFLOW    0xd
  106. #define SC_MISCOMPARE        0xe
  107. #define SC_RESERVED        0xf
  108.  
  109. /*
  110.  * SCSI Operation codes. 
  111.  */
  112. #define    SC_TEST_UNIT_READY    0x00
  113. #define    SC_REZERO_UNIT        0x01
  114. #define    SC_REQUEST_SENSE    0x03
  115. #define    SC_READ            0x08
  116. #define    SC_WRITE        0x0a
  117. #define    SC_SEEK            0x0b
  118.  
  119. #define    MORE_STATUS 0x80    /* More status flag */
  120. #define    STATUS_LEN  3        /* Max status len for SCSI */
  121.  
  122. #define    cdbaddr(cdb, addr)     (cdb)->high_addr = (addr) >> 16;\
  123.                 (cdb)->mid_addr = ((addr) >> 8) & 0xFF;\
  124.                 (cdb)->low_addr = (addr) & 0xFF
  125.  
  126.  
  127. #define NLPART    NDKMAP        /* number of logical partitions (8) */
  128.  
  129. /*
  130.  * SCSI unit block.
  131.  */
  132. struct scsi_unit {
  133.     char    un_target;        /* scsi bus address of controller */
  134.     char    un_lun;            /* logical unit number of device */
  135.     char    un_present;        /* unit is present */
  136.     u_char    un_scmd;        /* special command */
  137.     struct    scsi_unit_subr *un_ss;    /* scsi device subroutines */
  138.     struct    scsi_ctlr *un_c;    /* scsi ctlr */
  139.     struct    mb_device *un_md;    /* mb device */
  140.     struct    mb_ctlr *un_mc;        /* mb controller */
  141.     struct    buf un_utab;        /* queue of requests */
  142.     struct    buf un_sbuf;        /* fake buffer for special commands */
  143.     struct    buf un_rbuf;        /* buffer for raw i/o */
  144.     /* current transfer: */
  145.     u_short    un_flags;        /* misc flags relating to cur xfer */
  146.     int    un_baddr;        /* virtual buffer address */
  147.     daddr_t    un_blkno;        /* current block */
  148.     short    un_sec_left;        /* sector count for single sectors */
  149.     short    un_cmd;            /* command (for cdb) */
  150.     short    un_count;        /* num sectors to xfer (for cdb) */
  151.     int    un_dma_addr;        /* dma address */
  152.     u_short    un_dma_count;        /* byte count expected */
  153.     short    un_retries;        /* retry count */
  154.     short    un_restores;        /* restore count */
  155.     char    un_wantint;        /* expecting interrupt */
  156.     /* the following save current dma information in case of disconnect */
  157.     int    un_dma_curaddr;        /* current addr to start dma to/from */
  158.     u_short    un_dma_curcnt;        /* current dma count */
  159.     u_short    un_dma_curdir;        /* direction of dma transfer */
  160. };
  161.  
  162. /* 
  163.  * bits in the scsi unit flags field
  164.  */
  165. #define SC_UNF_DVMA    0x0001        /* set if cur xfer requires dvma */
  166.  
  167. struct scsi_ctlr {
  168.     struct    scsi_ha_reg *c_har;    /* sc bus registers in i/o space */
  169.     struct     scsi_ob_reg *c_obr;    /* si scsi ctlr logic regs */
  170.     struct    scsi_cdb c_cdb;        /* command description block */
  171.     struct    scsi_scb c_scb;        /* status completion block */
  172.     struct    scsi_sense *c_sense;    /* sense info on errors */
  173.     int    c_present;        /* bus is alive */
  174.     struct     scsi_unit *c_un;    /* scsi unit using the bus */
  175.     struct    scsi_ctlr_subr *c_ss;    /* scsi device subroutines */
  176.     struct    udc_table c_udct;    /* scsi dma info */
  177. };
  178.  
  179. struct    scsi_unit_subr {
  180.     int    (*ss_attach)();
  181.     int    (*ss_start)();
  182.     int    (*ss_mkcdb)();
  183.     int    (*ss_intr)();
  184.     int    (*ss_unit_ptr)();
  185.     char    *ss_devname;
  186. };
  187.  
  188. struct    scsi_ctlr_subr {
  189.     int    (*scs_ustart)();
  190.     int    (*scs_start)();
  191.     int    (*scs_done)();
  192.     int    (*scs_cmd)();
  193.     int    (*scs_getstat)();
  194.     int    (*scs_cmd_wait)();
  195.     int    (*scs_off)();
  196.     int    (*scs_reset)();
  197.     int    (*scs_dmacount)();
  198.     int    (*scs_go)();
  199. };
  200.  
  201. /*
  202.  * Defines for getting configuration parameters out of mb_device.
  203.  */
  204. #define    TYPE(flags)    (flags)
  205. #define TARGET(slave)    ((slave >> 3) & 07)
  206. #define LUN(slave)    (slave & 07)
  207.  
  208. #define SCSI_DISK    0
  209. #define SCSI_TAPE    1
  210. #define SCSI_FLOPPY    2
  211.  
  212. #define NUNIT        8    /* max nubmer of units per controller */
  213.  
  214. /*
  215.  * SCSI Error codes passed to device routines.
  216.  * The codes refer to SCSI general errors, not to device
  217.  * specific errors.  Device specific errors are discovered
  218.  * by checking the sense data.
  219.  * The distinction between retryable and fatal is somewhat ad hoc.
  220.  */
  221. #define    SE_NO_ERROR    0
  222. #define    SE_RETRYABLE    1
  223. #define    SE_FATAL    2
  224.